#1输入数字n，输出n天前的日期（time或者datatime模块）
import datetime
n = int(input("please input last day" ))
dt1 = datetime.datetime.now()
dt2 = datetime.timedelta(days=n)
print(dt1-dt2)


#2、输出指定文件夹下有哪些文件或文件夹（实现ls命令， os）
import os
def ls(path):
    print(os.listdir(path))

ls("F:\\2022.1.2")




#3、列表去重，并且从小到大排序
import random
lis = []
for i in range(1,31):
    ran = random.randint(0,10)
    lis.append(ran)
print(lis)
lis2 = set(lis)
lis3 = list(lis2)
print(lis3)
s = sorted(lis)



#4、如何在一个函数内部修改全局变量
#globals()来定义全局



#5、如何跨模块共享全局变量
#利用模块打包



#6、python的基本数据类型有哪些？
#字符串，布尔型，数值型（int,float,复数），列表，元组，字典，集合



#7、python中生成随机整数（1-10），随机小数（1-10），随机小数（0-1）的方法
import random
rannum0 = random.randint(1,10)
rannum1 = random.random()
rannum2 = random.uniform(1,10)

print(rannum0,rannum1,rannum2)



#8、python中哪些是可变数据类型，哪些是不可变数据类型
#字典，列表，集合可变；数值，字符串，元组不可变


#9、a+=1与a=a+1有什么区别
#对于可变对象，a += 1 直接在原内存地址上操作a = a + 1开辟新的内存操作
#对于不可变对象，a += 1和a = a + 1都是在新开辟的空间操作


#10、什么是pep8？说出5点它的标准
#1、使用空格来表示缩进而不要用制表符（Tab）。这一点对习惯了其他编程语言的人来说简直觉得不可理喻，因为绝大多数的程序员都会用Tab来表示缩进，但是要知道Python并没有像C/C++或Java那样的用花括号来构造一个代码块的语法，在Python中分支和循环结构都使用缩进来表示哪些代码属于同一个级别，鉴于此Python代码对缩进以及缩进宽度的依赖比其他很多语言都强得多。在不同的编辑器中，Tab的宽度可能是2、4或8个字符，甚至是其他更离谱的值，用Tab来表示缩进对Python代码来说可能是一场灾难。
#2、和语法相关的每一层缩进都用4个空格来表示。
#3、每行的字符数不要超过79个字符，如果表达式因太长而占据了多行，除了首行之外的其余各行都应该在正常的缩进宽度上再加上4个空格。
#4、函数和类的定义，代码前后都要用两个空行进行分隔。
#5、在同一个类中，各个方法之间应该用一个空行进行分隔。
#6、二元运算符的左右两侧应该保留一个空格，而且只要一个空格就好。


#11、给定一个字符串，找出字符串第一个重复的字符
str = 'alkhgiowaiegvnakbhoia'
lis = list(str)
exist = []
for i in lis:
    if i not in exist:
        exist.append(i)
    elif i in exist:
        print(i)
        break



#12、简述深拷贝与浅拷贝
#深拷贝与浅拷贝只有在可变数据类型包上可变数据类型才有分别，浅拷贝就只是拷贝第一层的地址，而深拷贝是拷贝所有层的地址全都复制下来，就和原来的无关了


#13、简述python内存机制
#引用计数为主，分代回收和标记清除为辅助的内存管理方式，还引用了小整型缓冲池以及常用字符串驻留区的方式进行内存分配管理


#14、使用python实现冒泡排序，快速排序
#排序
arraylist = []
while 1:
    array = input("please input value of the array or exit\n")
    if array == 'exit':
        break
    elif array.isdigit()  :
        int(array)
        arraylist.append(array)
    else:
        print("Invalid input")
print(arraylist)
print(type(arraylist[0]))

#冒泡排序
def bubble_sort():
    for i in range(0,len(arraylist)-1):
        for j in range(0,len(arraylist) -i -1):
            if int(arraylist[j]) >= int(arraylist[j+1]):
                k = arraylist[j+1]
                arraylist[j+1] = arraylist[j]
                arraylist[j] = k
                # arraylist[j],arraylist[j+1] = arraylist[j+1],arraylist[j]
                    #列表的用法

bubble_sort()
print(arraylist)

#快速排序
def quick_sort(arraylist1):
    if len(arraylist1) >=2:
        left,right = [] ,[]
        min = arraylist1[0]
        for i in range(1,len(arraylist1)):
            if int(arraylist1[i]) >= int(min):
                right.append(arraylist1[i])
            elif int(arraylist1[i]) < int(min):
                left.append(arraylist1[i])

        return quick_sort(left) + [min] +quick_sort(right)
    else:
        return arraylist1

quick_sort(arraylist)
print(quick_sort(arraylist))



#15,回文
str = input("please input string\n")
lis = list(str)
if lis == lis[::-1]:
    print("yes")
else:
    print("no")


# 16、要求提取出这个文本里面的ip字段、时间字段、带宽字段每个字段都是以空白作为分割
# ip字段在第一个  时间字段在第四个 带宽字段在第10个
# 首先将时间格式都统一转化为 2021-06-04 04:00:20  （time）
#  通过ip 去解析出它的省份和运营商是什么    （requests，json）
#  https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=106.11.159.66
#  isp就是运营商字段   region就是省份字段
#  最后将得到的  时间、省份、运营商、带宽字段都写入文件
#
#  2021-06-04 04:00:20,湖南,电信,1004


import requests
import datetime
def ip_check(ip):
    global province ,isp
    r = requests.get('https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=%s' % ip)
    if r.json()['code']==0:
        i = r.json()['data']
        province = i['region']
        isp = i['isp']


with open ('weblog.txt','r') as fp:
    for line in fp:
        line2 = line.split(" ")
        ip = line2[0]
        time = line2[3]
        bandwidth = line2[9]
        ip_check(ip)
        s = datetime.datetime.strptime(time,'[%d/%b/%Y:%H:%M:%S')
        print(s, f'省份：{province} ,运营商:{isp}',bandwidth)

#17，IP地址的检测和异常处理
import IPy
import subprocess
import re


def check_ip(genmask):
    compile_ip = re.compile(
        '^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(0)/(\d|[1-2]\d|3[0-2])$')
    if compile_ip.match(genmask):
        return True
    else:
        return False

with open("ip.txt","a+") as fp:

    while 1:
                genmask = input("please input network segment you want to detect or exit \n")
                if(genmask == 'exit'):
                        break
                else:
                        try:
                                if(check_ip(genmask) is False):
                                        raise ValueError("输入错误")
                        except ValueError:
                                print("输入不合规，请重新输入")
                                continue
                        else:

                                for i in IPy.IP(genmask):
                                        ips = subprocess.call(f"ping {i} -c 1 &</dev/null",shell="True")
                                        if(ips == 0):
                                                fp.write(f"{i}已经被使用\n")
                                        else:
                                                fp.write(f"{i}未被使用\n")
                                        fp.flush()


                                break

